//package com.binance.gateway.filter.limit;
//
//import com.marcosbarbero.cloud.autoconfigure.zuul.ratelimit.config.RateLimitKeyGenerator;
//import com.marcosbarbero.cloud.autoconfigure.zuul.ratelimit.config.RateLimitUtils;
//import com.marcosbarbero.cloud.autoconfigure.zuul.ratelimit.config.RateLimiter;
//import com.marcosbarbero.cloud.autoconfigure.zuul.ratelimit.config.properties.RateLimitProperties;
//import com.netflix.zuul.context.RequestContext;
//import org.springframework.cloud.netflix.zuul.filters.Route;
//import org.springframework.cloud.netflix.zuul.filters.RouteLocator;
//import org.springframework.stereotype.Component;
//import org.springframework.web.util.UrlPathHelper;
//
//import javax.servlet.http.HttpServletRequest;
//
//import static com.marcosbarbero.cloud.autoconfigure.zuul.ratelimit.support.RateLimitConstants.REQUEST_START_TIME;
//import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.POST_TYPE;
//
//@Component
//public class UrlRateLimitPostFilter extends AbstractRateLimitFilter {
//
//    private final RateLimiter rateLimiter;
//    private final RateLimitProperties properties;
//
//    public UrlRateLimitPostFilter(RateLimitProperties properties, RouteLocator routeLocator,
//                                  UrlPathHelper urlPathHelper, RateLimiter rateLimiter,
//                                  RateLimitKeyGenerator rateLimitKeyGenerator, RateLimitUtils rateLimitUtils) {
//        super(properties, routeLocator, urlPathHelper, rateLimitUtils, rateLimitKeyGenerator);
//        this.properties = properties;
//        this.rateLimiter = rateLimiter;
//    }
//
//    @Override
//    public boolean shouldFilter() {
//        return super.shouldFilter() && getRequestStartTime() != null;
//    }
//
//    @Override
//    public String filterType() {
//        return POST_TYPE;
//    }
//
//    @Override
//    public int filterOrder() {
//        return properties.getPostFilterOrder();
//    }
//
//    @Override
//    public Object run() {
//        RequestContext ctx = RequestContext.getCurrentContext();
//        HttpServletRequest request = ctx.getRequest();
//        Route route = route(request);
//
//        policy(route, request).forEach(policy -> {
//            Long requestTime = System.currentTimeMillis() - getRequestStartTime();
//            final String key = super.getUserIdUrlKey(request, route, policy);
//            rateLimiter.consume(policy, key, requestTime > 0 ? requestTime : 1);
//        });
//
//        return null;
//    }
//
//    private Long getRequestStartTime() {
//        final RequestContext ctx = RequestContext.getCurrentContext();
//        final HttpServletRequest request = ctx.getRequest();
//        return (Long) request.getAttribute(REQUEST_START_TIME);
//    }
//}